#!/usr/bin/python
# -*- coding: UTF-8 -*-
#载入
import sys #系统模块
import os #文件模块
import ftplib #ftp共享模块
import socket #套接字模块
import re #正则模块
import hashlib #MD5模块
import json #字典模块
from pathlib import Path #路径模块

HOST = '172.31.3.3' #FTP主机
user = "djsc"
password = "djsc"
buffer_size = 8192
BDWJJ = r"D:\TEST" #放一个全局变量存本地文件夹的名称
FTPWJJ = "CMBtest" #这个是FTP文件夹的名称
BDJSON = "" #本地的JSON文件内容
WJJSON = {} #实时读取的文件md5字典
JSCZ = False #默认json文件是不存在的

#md5校验模块
def md5_calc(file):
	md5_value=hashlib.md5()
	with open(file,'rb') as file_b:
		while True:
			data_flow=file_b.read(8096) #每次读入8089kb进入内存
			if not data_flow: #读取完后返回空值，False
				break
			md5_value.update(data_flow)
	file_b.close()
	return md5_value.hexdigest()

#上传文件
def upload(ftp, filepath):
	f = open(filepath, "rb")
	file_name = os.path.split(filepath)[-1]
	try:
		ftp.storbinary('STOR %s'%file_name, f, buffer_size)
		print('uploaded： "%s"' % file_name) #成功上传文件：
	except ftplib.error_perm:
		return False
	return True

#查找是否存在指定文件    
def find(ftp,filename):
	ftp_f_list = ftp.nlst() #获取目录下文件、文件夹列表
	if filename in ftp_f_list:
		return True
	else:
		return False

#主要模块
def main():
	#模块内主动连接
	try:
		f = ftplib.FTP(HOST)
	except (socket.error, socket.gaierror):
		print('ERROR:cannot reach " %s"' % HOST)
		return
	print('*** Connected to host "%s"' % HOST)

	#登录
	try:
		f.login(user = user, passwd = password)
	except ftplib.error_perm:
		print('FTP login failed，please check host name,user name,password is correct') #FTP登陆失败，请检查主机号、用户名、密码是否正确
		f.quit()
		return
	print('*** land successfully')

	# 判断远程文件夹是否存在,存在就存在呗,又不能对它怎样,不存在就直接创建
	if find(f,FTPWJJ):
		print('*** Directory exists')
	else:
		try:
			f.mkd(FTPWJJ) #新建远程目录
		except ftplib.error_perm:
			print("r1 dir existed or can not create!!") #第一次目录无法创建!!
		print('*** Successfully created')

	#重定向到指定路径
	try:
		f.cwd(FTPWJJ)
	except ftplib.error_perm:
		print('can not enter the dir："%s"' % FTPWJJ) #不可以进入目录：
	print(f.pwd()) #返回当前所在位置

	#判断校验的json文件是否存在
	jsonfile = Path(BDWJJ + r"\\" + r"verify.json")
	if(jsonfile.exists()):
		# 指定的文件或目录存在
		global JSCZ
		JSCZ = True

	#遍历本地文件夹的内容,然后上传满足条件的csv档
	dirs = os.listdir(BDWJJ)
	for file in dirs:
		if re.search(r'^.*?\.csv$', file, re.I):
			ftpfile = BDWJJ + r'\\' + file #这个是本地文件的路径+文件名
			#计算文件的md5结果
			mdstr = md5_calc(ftpfile)
			#判断 mdstr 结果是不是和JSON文件读出来的结果一致,不一致就删除ftp上的同名文件,然后重新上传文件
			if (JSCZ): #如果JSON文件存在,就取出判断,不存在就直接写JSON文件和存所有csv
				with open(jsonfile, 'r') as bdj: #JSON文件存在
					BDJSON = json.load(bdj) #读出JSON内容解析成字典
				if(BDJSON.__contains__(str(file))): #判断如果键存在
					if(BDJSON[file] != mdstr): #存在就判断值是否等于现在文件的MD5,通过就
						f.delete(file) #删除远程文件
						upload(f, ftpfile) #上传本地文件
				else: #键不存在就直接上传
					upload(f, ftpfile) #上传本地文件
			else: #否则就是没有存在JSON文件,直接上传
				upload(f, ftpfile) #上传本地文件
			WJJSON[file] = mdstr #写到字典,供后面回写JSON文件

	#结束前先把JSON文件写了
	# 写入 JSON 数据
	with open(jsonfile, 'w') as bdj:
		json.dump(WJJSON, bdj)

	#退出连接并结束程序
	f.quit()
	return

#进来就运行主要模块
if __name__ == '__main__':
	main()